package com.jd.platform.gobrs.sample.controller;

import com.jd.platform.gobrs.client.dispatcher.GCache;
import com.jd.platform.gobrs.client.manager.AutoCacheManager;
import com.jd.platform.gobrs.client.manager.ManualCacheManager;
import com.jd.platform.gobrs.sample.Cache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author sizegang wrote on 2020-02-21
 * @version 1.0
 */
@RestController
@RequestMapping
public class TestController {

    @Resource
    private Cache cache;
    private Logger logger = LoggerFactory.getLogger(getClass());


    /**
     * 往redis里添加20个key
     */
//    @RequestMapping("addKey")
//    public Object add(Integer count) {
//        if (count == null) {
//            count = 20;
//        }
//        for (int i = 0; i < count; i++) {
//            cache.set("key" + i, "我是一个用来做测试的value：" + i);
//        }
//        return "success";
//    }

    /**
     * 从redis查询key
     */
//    @RequestMapping("find")
//    public Object findNormal(Integer count) {
//        if (count == null) {
//            count = 20;
//        }
//        List<String> values = new ArrayList<>(count);
//        for (int i = 0; i < count; i++) {
//            values.add(cache.getFromRedis("key" + i));
//        }
//        return values;
//    }

    /**
     * 使用热key查询，从redis查询key
     */
//    @RequestMapping("findHot")
//    public Object findWithHotKey(Integer count) {
//        if (count == null) {
//            count = 20;
//        }
//        List<String> values = new ArrayList<>(count);
//        for (int i = 0; i < count; i++) {
//            values.add(cache.get("key" + i));
//        }
//        return values;
//    }
//
//
//    @RequestMapping("hot")
//    public Object hot(Integer count) {
//        cache.get("key" + count);
//
//        return 1;
//    }
//    @RequestMapping("/hotKey")
//    public Object hotKey(String key) {
//        if (!StringUtils.isEmpty(key) && JdHotKeyStore.isHotKey(key)) {
//            return "isHot";
//        } else {
//            return "noHot";
//        }
//    }
//
//    @DeleteMapping("")
//    public Object aDelete() {
//        JdHotKeyStore.remove("a");
//
//        return 1;
//    }
//

    @Resource
    private GCache gCache;

    @RequestMapping("testHotkey")
    public String testHot(@RequestParam("skuId") String skuId) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 999999; i++) {
            executorService.submit(() -> {
                try {
                    Object cache = gCache.getCache(skuId);
                    if (cache == null) {
                        System.out.println("设置缓存");
                        gCache.setCache(skuId, UUID.randomUUID().toString());
                    } else {
                        System.out.println("缓存" + cache);
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            });
            try {
                Thread.sleep(150);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return "";
    }


    /**
     * 只要使用autoCacheManager 会将每次产生的key 推送到worker端
     */
    @RequestMapping("testkeyByAuto")
    public String testkeyByAuto(@RequestParam("skuId") String skuId) {
        Object cache = gCache.getCacheAuto(skuId, () -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("上游RPC数据");
            return new byte[10240];
        });
        System.out.println("resutl=> " + cache);
        return "";
    }


}
